int main(int argc, char **argv)
{
- int ret;
+ int ret, dom;
if ( argv[0] != NULL )
argv0 = argv[0];
if ( (argc == 3) && strcmp("-f", argv[1]) )
goto usage;
- ret = kill_domain(atoi(argv[argc-1]), argc == 3);
+ dom = atoi(argv[argc-1]);
+ if ( dom == 0 )
+ {
+ ERROR("Did you really mean domain 0?");
+ return 1;
+ }
+
+ ret = kill_domain(dom, argc == 3);
return (ret != 0) ? 1 : 0;
}
static struct list_head dev_list;
+/*
+ * Needed because network_close() is not properly implemented yet. So
+ * an open after a close needs to do much less than the initial open.
+ */
+static int opened_once_already = 0;
+
struct net_private
{
struct list_head list;
struct net_private *np = dev->priv;
int i, error = 0;
+ if ( opened_once_already )
+ {
+ memset(&np->stats, 0, sizeof(np->stats));
+ netif_start_queue(dev);
+ return 0;
+ }
+
np->rx_resp_cons = np->tx_resp_cons = np->tx_full = 0;
memset(&np->stats, 0, sizeof(np->stats));
spin_lock_init(&np->tx_lock);
MOD_INC_USE_COUNT;
+ opened_once_already = 1;
+
return 0;
fail:
virt_to_machine(get_ppte(skb->head));
}
- np->net_idx->rx_req_prod = i;
-
- np->net_idx->rx_event = RX_RING_INC(np->rx_resp_cons);
-
/*
* We may have allocated buffers which have entries outstanding in
* the page update queue -- make sure we flush those first!
*/
flush_page_update_queue();
+
+ np->net_idx->rx_req_prod = i;
+
+ np->net_idx->rx_event = RX_RING_INC(np->rx_resp_cons);
+
HYPERVISOR_net_update();
}
{
netif_stop_queue(dev);
- free_irq(NET_RX_IRQ, dev);
- free_irq(NET_TX_IRQ, dev);
-
/*
* XXXX This cannot be done safely until be have a proper interface
* for setting up and tearing down virtual interfaces on the fly.
* no sensible way of retrieving them.
*/
#if 0
+ free_irq(NET_RX_IRQ, dev);
+ free_irq(NET_TX_IRQ, dev);
+
network_free_rx_buffers(dev);
kfree(np->net_ring->rx_ring);
kfree(np->net_ring->tx_ring);
-#endif
MOD_DEC_USE_COUNT;
+#endif
return 0;
}